/*
  学习目标：嵌套路由的基本使用
*/
import React from 'react';

import {
  BrowserRouter as Router,
  Link,
  NavLink,
  Redirect,
  Route,
  Switch,
} from 'react-router-dom';
import './base.css';

export default class App extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <h1>app组件</h1>
          <NavLink activeClassName="xxx" to="/home">
            调到Home
          </NavLink>
          <br />
          <NavLink exact to="/my">
            调到我的音乐
          </NavLink>
          <br />
          <NavLink to="/friend">调到朋友</NavLink>
          <Switch>
            <Redirect from="/" to="/home" exact />
            <Route path="/home" component={Home} />
            <Route path="/my" component={MyMusic} />
            {/* 2. 💥 父级路由Route不能使用exact */}
            <Route path="/friend" component={Friend} />

            <Route component={NotFound} />
          </Switch>
        </div>
      </Router>
    );
  }
}

function NotFound(params) {
  return <h1>404页面</h1>;
}

function Home() {
  return <h1>我是首页组件</h1>;
}

function MyMusic() {
  return <h1>我是我的音乐件</h1>;
}

function Friend() {
  return (
    <>
      <h1>我是朋友组件</h1>
      <Link to="/friend">朋友1</Link>
      <br />
      <Link to="/friend/friend2">朋友2</Link>
      <br />
      <Link to="/friend/friend3">朋友3</Link>
      {/* 在父组件内, 再次使用Switch包住Route, 设置二级路由的挂载点和匹配规则 */}
      {/* 
        注意:
          💥1. 二级路由, path的值, 从"/父级/子路由路径"
          💥2. 父级路由Route不能使用exact
          💥3. 父子级path可以同名, 互不影响
          💥4. to属性跳转二级路由, to的值需要从"/一级路径/二级路径"
      */}
      <Switch>
        <Route path="/friend/friend2" component={Friend2} />
        <Route path="/friend/friend3" component={Friend3} />
        <Route path="/friend" component={Friend1} />
      </Switch>
    </>
  );
}

function Friend1() {
  return <h1>我是朋友1组件</h1>;
}
function Friend2() {
  return <h2>我是朋友2组件</h2>;
}
function Friend3() {
  return <h3>我是朋友3组件</h3>;
}
